package logica;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;

import persistencia.Configuracion;
import persistencia.PersistenciaGestion;

import excepciones.LogicaException;
import excepciones.PersistenciaException;
import logica.ServicioLoginStub.CreateUser;
import logica.ServicioLoginStub.ExistsUser;
import logica.ServicioLoginStub.ExistsUserResponse;
import logica.ServicioLoginStub.RemoveUser;
import logica.ServicioLoginStub.ListUsersResponse;
import logica.ServicioLoginStub.ValidateUser;
import logica.ServicioLoginStub.ValidateUserResponse;


public class FachadaGestion {
	private ServicioLoginStub clienteWs;
	
	public FachadaGestion() throws PersistenciaException, AxisFault {
		clienteWs = new ServicioLoginStub(Configuracion.getInstancia().getProperty(Configuracion.URL_SERVIDOR));
	}
	
	/**
	 * Crea un usuario
	 * @param _name Nombre del usuario
	 * @param _pass Password del usuario
	 * @throws LogicaException 
	 * @throws PersistenciaException 
	 */
	public void crearUsuario(String _name, String _pass) throws LogicaException, PersistenciaException {
		try {	
			CreateUser req = new CreateUser();
			req.setName(_name);
			req.setPwd(_pass);
			this.clienteWs.createUser(req);
			PersistenciaGestion.getInstancia().persistirUsuario(_name);
		} catch (RemoteException e) {
			throw new LogicaException(LogicaException.ERROR_COMUNICACION);
		} catch (PersistenciaException e) {
			throw new PersistenciaException(PersistenciaException.ERROR_GUARDANDO_USUARIO);
		}
	}
	
	/**
	 * Borra un usuario
	 * @param _name Nombre del usuario
	 * @throws LogicaException 
	 */
	public void borrarUsuario(String _name) throws LogicaException {
		try {
			RemoveUser req = new RemoveUser();
			req.setName(_name);
			this.clienteWs.removeUser(req);
		} catch (RemoteException e) {
			throw new LogicaException(LogicaException.ERROR_COMUNICACION);
		}
	}
	
	/**
	 * Lista todos los usuarios registrados
	 * @return String[]
	 * @throws LogicaException 
	 */
	public String[] listarUsuarios() throws LogicaException {
		String respData = "";
		try {
			ListUsersResponse resp;
			resp = this.clienteWs.listUsers();
			respData = resp.get_return();
		} catch (RemoteException e) {
			e.printStackTrace();
			throw new LogicaException(LogicaException.ERROR_COMUNICACION);
		}
		return respData.split(",");
	}
	
	/**
	 * Valida si las credenciales del ususario corresponden con algún usuario registrado
	 * 
	 * @param _name Nombre del usuario
	 * @param _pass Password del usuario
	 * @return boolean
	 * @throws LogicaException 
	 */
	/*public boolean validarUsuario(String _name, String _pass) throws LogicaException {
		boolean ret = false;
		try {	
			ValidateUser req = new ValidateUser();
			req.setName(_name);
			req.setPwd(_pass);
			ValidateUserResponse resp = this.clienteWs.validateUser(req);
			ret = resp.get_return();
		} catch (RemoteException e) {
			throw new LogicaException(LogicaException.ERROR_COMUNICACION);
		}
		return ret;
	}*/
	
	/**
	 * 
	 * @param _name El nombre del usuario
	 * @return
	 * @throws LogicaException
	 */
	public boolean existeUsuario(String _name) throws LogicaException {
		boolean ret = false;
		if (existeUsuario(_name)) throw new LogicaException(LogicaException.ERROR_USUARIO_EXISTE);
		try {	
			ExistsUser req = new ExistsUser();
			req.setName(_name);
			ExistsUserResponse resp = this.clienteWs.existsUser(req);
			ret = resp.get_return();
		} catch (RemoteException e) {
			throw new LogicaException(LogicaException.ERROR_COMUNICACION);
		}
		return ret;
	}
}
